package com.manxi.mall.mapper;  // 包路径已正确

import com.manxi.mall.bean.TrafficUvCt;  // 包路径已正确
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author Addroc
 * @date 2024/6/14
 * 流量域统计Mapper接口
 * 用于处理网站流量相关的数据统计查询
 */
public interface TrafficStatsMapper {

    /**
     * 获取某天各个渠道的独立访客（UV）数量
     * 按照UV数量降序排列，用于分析各渠道的用户获取效果
     * @param date 日期参数，格式为yyyyMMdd
     * @param limit 返回的渠道数量限制，用于控制返回的Top N渠道
     * @return 返回各渠道UV数量列表，按UV数量降序排列
     */
    @Select("select ch,sum(uv_ct) uv_ct from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date} " +
            "group by ch order by uv_ct desc limit #{limit}")
    List<TrafficUvCt> selectChUvCt(@Param("date") Integer date, @Param("limit") Integer limit);

    /**
     * 获取某天各个地区的独立访客（UV）数量
     * 用于分析用户地域分布情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各地区UV数量列表，按UV数量降序排列
     */
    @Select("select region,sum(uv_ct) uv_ct from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date} " +
            "group by region order by uv_ct desc")
    List<TrafficUvCt> selectRegionUvCt(@Param("date") Integer date);

    /**
     * 获取某天各个设备的独立访客（UV）数量
     * 用于分析用户设备使用情况，如PC、Mobile、Tablet等
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各设备UV数量列表，按UV数量降序排列
     */
    @Select("select device,sum(uv_ct) uv_ct from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date} " +
            "group by device order by uv_ct desc")
    List<TrafficUvCt> selectDeviceUvCt(@Param("date") Integer date);

    /**
     * 获取某天各个页面的浏览量（PV）数量
     * 用于分析页面访问热度和用户浏览行为
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各页面PV数量列表，按PV数量降序排列
     */
    @Select("select page,sum(pv_ct) pv_ct from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date} " +
            "group by page order by pv_ct desc")
    List<TrafficUvCt> selectPagePvCt(@Param("date") Integer date);

    /**
     * 获取某天的总PV（页面浏览量）数量
     * 用于分析网站整体流量情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回总PV数量
     */
    @Select("select sum(pv_ct) total_pv from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date}")
    Long selectTotalPv(@Param("date") Integer date);

    /**
     * 获取某天的总UV（独立访客）数量
     * 用于分析网站整体用户访问情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回总UV数量
     */
    @Select("select sum(uv_ct) total_uv from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date}")
    Long selectTotalUv(@Param("date") Integer date);

    /**
     * 获取某天新老访客分布情况
     * 用于分析用户留存和新用户获取情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回新老访客UV数量列表
     */
    @Select("select is_new,sum(uv_ct) uv_ct from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date} " +
            "group by is_new")
    List<TrafficUvCt> selectNewOldUvCt(@Param("date") Integer date);

    /**
     * 获取某天的会话数量
     * 用于分析用户访问频次和活跃度
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回会话数量
     */
    @Select("select sum(session_ct) total_session from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date}")
    Long selectTotalSession(@Param("date") Integer date);

    /**
     * 获取某天的跳出率统计
     * 用于分析页面质量和用户体验
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回跳出率（百分比）
     */
    @Select("select (sum(bounce_ct) * 100.0 / sum(session_ct)) bounce_rate " +
            "from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date}")
    BigDecimal selectBounceRate(@Param("date") Integer date);

    /**
     * 获取某天各时段的UV分布
     * 用于分析用户访问时间分布规律
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各时段UV数量列表
     */
    @Select("select hour(ts) hour,sum(uv_ct) uv_ct from dws_traffic_vc_ch_ar_is_new_page_view_window partition par#{date} " +
            "group by hour(ts) order by hour(ts)")
    List<TrafficUvCt> selectHourlyUvCt(@Param("date") Integer date);
}